using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Text.RegularExpressions;
using DataTransferObject;
using Business;

namespace Presentation
{
    public partial class FrmQuyDinh : Form
    {
        clsThayDoiQuyDinhDTO ThayDoiQuyDinhDTO = new clsThayDoiQuyDinhDTO();
        clsQuanTriBUS QuanTriBUS = new clsQuanTriBUS();
        DataTable tbl = new DataTable();

        int TuoiToiDa_Truoc;
        int TuoiToiThieu_Truoc;
        int SoNgayMuonToiDa_Truoc;
        int SoNgayMuonToiThieu_Truoc;
        int ThoiHanThe_Truoc;
        long TienPhatTre_Truoc;

        public FrmQuyDinh()
        {
            InitializeComponent();
        }

        #region Phương thức đưa dữ liệu lên form.

        //Phương thức đưa dữ liệu lên form.
        private void LoadForm()
        {
            HienThiTextBox(false);
            btnluu.Enabled = false;
            LoadDataToTextBox(); //Đưa dữ liệu lên textbox.
        }

        //Phương thức đưa dữ liệu lên textbox.
        private void LoadDataToTextBox()
        {
            tbl = QuanTriBUS.ThayDoiQuyDinhBUS.DanhSachThayDoiQuyDinh();
            object[] obj = new object[6];
            obj = tbl.Rows[0].ItemArray; //Lấy dòng đầu tiên trong bảng Thay đổi quy định.
            
            //Đưa dữ liệu lên TextBox.
            txttuoitoida.Text = obj[0].ToString();
            txttuoitoithieu.Text = obj[1].ToString();
            txtthoihanthe.Text = obj[2].ToString();
            txtsongaymuontoida.Text = obj[3].ToString();
            txtsosachmuon.Text = obj[4].ToString();
            txttienphattre.Text = obj[5].ToString();
            //--------------------------------------

            //Lấy các thông tin trước (dùng để kiểm tra dữ liệu nhập).
            TuoiToiDa_Truoc = (int)obj[0];
            TuoiToiThieu_Truoc = (int)obj[1];
            SoNgayMuonToiDa_Truoc = (int)obj[2];
            SoNgayMuonToiThieu_Truoc = (int)obj[3];
            ThoiHanThe_Truoc = (int)obj[4];
            TienPhatTre_Truoc = Convert.ToInt64(obj[5]);
        }
        #endregion

        #region Các phương thức thêm, sửa, xóa

        //Phương thức sửa quy định.
        private void SuaThayDoiQuyDinh()
        {
            ThayDoiQuyDinhBUSResult rs;
            bool check;

            //Kiểm tra xem có thuộc tính nào bị âm ko.
            check = false;
            check = KiemTraNhapAm(ThayDoiQuyDinhDTO);

            if (check == false) //Nếu có thuộc tính âm.
                return;

            rs = QuanTriBUS.ThayDoiQuyDinhBUS.SuaThayDoiQuyDinh(ThayDoiQuyDinhDTO); //Gọi phượng thức sửa dữ liệu.
            if (rs == ThayDoiQuyDinhBUSResult.OK) //Nếu sửa thành công.
                MessageBox.Show("Đã cập nhật thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else //Sửa thất bại.
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Không cập nhật được!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            RefreshForm(); //Refresh form.
            btnsua.Text = "Sửa";
        }
        #endregion

        #region Các phương thức kiểm tra, refresh data

        //Phương thức kiểm tra chuỗi có phải là số.
        private bool IsNumericRegEx(string str)
        {
            str = str.Trim();
            return (Regex.IsMatch(str, @"^[\+\-]?\d*\.?[Ee]?[\+\-]?\d*$"));
        }

        //Phương thức set dữ liệu mặc định là 0 nếu nó rỗng.
        private void SetDataDefault()
        {
            //Duyệt qua tất cả Controls trên form.
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl.GetType() == typeof(DevComponents.DotNetBar.Controls.GroupPanel)) //Nếu là GroupPanel.
                {
                    DevComponents.DotNetBar.Controls.GroupPanel GroupPanel = new DevComponents.DotNetBar.Controls.GroupPanel();
                    GroupPanel = (DevComponents.DotNetBar.Controls.GroupPanel)ctrl;

                    foreach (Control ctrlInGroup in GroupPanel.Controls) //Duyệt các control trong GroupPanel.
                    {
                        if (ctrlInGroup.GetType() == typeof(DevComponents.DotNetBar.Controls.TextBoxX)) //Nếu là TextBoxX.
                        {
                            DevComponents.DotNetBar.Controls.TextBoxX textBoxX = new DevComponents.DotNetBar.Controls.TextBoxX();
                            textBoxX = (DevComponents.DotNetBar.Controls.TextBoxX)ctrlInGroup;
                            if (textBoxX.Text.Trim().Equals(""))
                                textBoxX.Text = "0";
                        }
                    }
                }
            }
        }

        //Phương thức kiểm tra nhập số âm.
        private bool KiemTraNhapAm(clsThayDoiQuyDinhDTO obj)
        {
            ThayDoiQuyDinhBUSResult rs = QuanTriBUS.ThayDoiQuyDinhBUS.KiemTraRong(obj);

            if (rs == ThayDoiQuyDinhBUSResult.TUOITOITHIEUERROR)
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Tuổi tối thiểu không được nhỏ hơn 0!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txttuoitoithieu.Focus();
                return false;
            }
            if (rs == ThayDoiQuyDinhBUSResult.TUOITOIDAERROR) 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Tuổi tối đa không được nhỏ hơn 0!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txttuoitoida.Focus();
                return false;
            }
            if (rs == ThayDoiQuyDinhBUSResult.THOIHANTHEERROR) 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Thời hạn thẻ không được nhỏ hơn 0!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtthoihanthe.Focus();
                return false;
            }
            if (rs == ThayDoiQuyDinhBUSResult.SONGAYMUONTOIDAERROR) 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Số ngày mượn tối đa không được nhỏ hơn 0!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtsongaymuontoida.Focus();
                return false;
            }
            if (rs == ThayDoiQuyDinhBUSResult.SOSACHMUONTOIDAERROR) 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Số sách mượn tối đa không được nhỏ hơn 0!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtsosachmuon.Focus();
                return false;
            }
            if (rs == ThayDoiQuyDinhBUSResult.TIENPHATSACHTREERROR) 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Tiền phạt trả sách trễ không được nhỏ hơn 0!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txttienphattre.Focus();
                return false;
            }
            return true;
        }

        //
        private bool KiemTraNhapHopLe()
        {
            if (!IsNumericRegEx(txttuoitoithieu.Text))
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Tuổi tối thiểu phải là số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txttuoitoithieu.Focus();
                return false;
            }
            if (!IsNumericRegEx(txttuoitoida.Text))
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Tuổi tối đa phải là số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txttuoitoida.Focus();
                return false;
            }
            if (!IsNumericRegEx(txtthoihanthe.Text))
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Thời hạn thẻ phải là số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtthoihanthe.Focus();
                return false;
            }
            if (!IsNumericRegEx(txtsongaymuontoida.Text))
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Số ngày mượn tối đa phải là số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtsongaymuontoida.Focus();
                return false;
            }
            if (!IsNumericRegEx(txtsosachmuon.Text))
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Số sách mượn tối đa phải là số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtsosachmuon.Focus();
                return false;
            }
            if (!IsNumericRegEx(txttienphattre.Text))
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Tiền phạt trả sách trễ phải là số!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txttienphattre.Focus();
                return false;
            }
            return true;
        }

        //Phương thức Refresh lại form.
        private void RefreshForm()
        {
            LoadForm();
        }

        #endregion

        #region Các phương thức ẩn-hiện Button, Textbox, Tạo cột cho DataGrid.

        //(Ẩn/hiện) Button.
        private void HienThiButton(bool dieukien)
        {
            btnsua.Enabled = dieukien;
            btnluu.Enabled = dieukien;
        }

        //(Ẩn/hiện) TextBox.
        private void HienThiTextBox(bool a)
        {
            txttuoitoida.Enabled = a;
            txttuoitoithieu.Enabled = a;
            txtsongaymuontoida.Enabled = a;
            txtsosachmuon.Enabled = a;
            txtthoihanthe.Enabled = a;
            txttienphattre.Enabled = a;
        }
        #endregion

        #region Các phương thức thay đổi nút, chữ trên nút.

        //Khi nhấn nút sửa.
        private void NutSua()
        {
            btnsua.Text = "Hủy Bỏ";
            HienThiButton(false); //Ẩn tất cả các button.
            btnsua.Enabled = true;
            btnluu.Enabled = true;

            HienThiTextBox(true); //Hiển thị các textbox.
        }

        //Khi nhấn nút hủy bỏ sửa.
        private void NutHuyBoSua()
        {
            btnsua.Text = "Sửa";
            HienThiButton(false); //Ẩn tất cả các button.
            btnsua.Enabled = true;

            HienThiTextBox(false);
        }
        #endregion

        //Events.
        #region Các phương thức của các sự kiện trên form.

        private void FrmQuyDinh_Load(object sender, EventArgs e)
        {
            LoadForm(); //Gọi phương thức đưa dữ liệu lên form.
        }

        private void btnthoat_Click(object sender, EventArgs e)
        {
            DialogResult dlg = new DialogResult();
            dlg = DevComponents.DotNetBar.MessageBoxEx.Show("Bạn có muốn thoát không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dlg == DialogResult.Yes)
            {
                this.Close();
            }
        }

        private void btnsua_Click(object sender, EventArgs e)
        {
            if (btnsua.Text == "Sửa")
            {
                NutSua(); //Khi nhấn nút sửa.
            }
            else
            {
                NutHuyBoSua(); //Khi nhấn nút hủy bỏ sửa.
            }
        }

        private void btnluu_Click(object sender, EventArgs e)
        {
            SetDataDefault(); //Set dữ liệu mặc định là 0 nếu nó rỗng.

            bool check;

            //Kiểm tra xem có thuộc tính nào không phải là số ko.
            check = false;
            check = KiemTraNhapHopLe();

            if (check == false) //Nếu có thuộc tính không phải là số.
                return;

            //Lấy dữ liệu.
            ThayDoiQuyDinhDTO.TuoiToiDa = Convert.ToInt32(txttuoitoida.Text);
            ThayDoiQuyDinhDTO.TuoiToiThieu = Convert.ToInt32(txttuoitoithieu.Text);
            ThayDoiQuyDinhDTO.SoNgayMuonToiDa = Convert.ToInt32(txtsongaymuontoida.Text);
            ThayDoiQuyDinhDTO.SoSachMuonToiDa = Convert.ToInt32(txtsosachmuon.Text);
            ThayDoiQuyDinhDTO.ThoiHanThe = Convert.ToInt32(txtthoihanthe.Text);
            ThayDoiQuyDinhDTO.TienPhatSachTre = Convert.ToInt64(txttienphattre.Text);

            SuaThayDoiQuyDinh(); //Gọi phương thức sửa quy định.
        }
        #endregion
    }
}